import axios, { type CreateAxiosDefaults } from 'axios';
import Cookies from 'js-cookie'
import { portalMessageSend } from '@ncp-web/portal-communication'

function webAxiosCreate(config?: CreateAxiosDefaults) {
    const instance = axios.create(Object.assign({}, config));

    // 添加全局 response 拦截器
    instance.interceptors.response.use(
        // 成功回掉
        res => {
            // 获取返回数据
            const data = res.data
            // 如果是附件下载类的请求则直接返回二进制数据
            if (
                res.headers &&
                res.headers['content-disposition'] &&
                res.headers['content-disposition'].includes('attachment;filename=')
            ) {
                return data
                // 二级代码
            } else if (/(.*)selectcodes\/(.*)/.test(res.config.url!)) {
                res.data = res.data.data
                return res
            } else if (data instanceof ArrayBuffer) {
                return data
            } else if (
                res.headers.hasOwnProperty('content-type') &&
                !res.headers['content-type'].startsWith('application/json')
            ) {
                return res
            } else {
                if (data.hasOwnProperty('code')) {
                    if (data.code == '-4') {
                        // 超时，直接将信息发送给 portal，hsa-seed 不做任何处理
                        portalMessageSend.notifySessionTimeout({ content: 'session timeout' } as any)
                    } else if (data.code != '0') {
                        return Promise.reject(new Error(data.message || 'Error'))
                    } else {
                        return data.data
                    }
                } else {
                    return Promise.reject(new Error('返回数据格式不正确！'))
                }
            }
        },
        // 失败回掉
        err => {
            // 如果是开发模式则在控制台输出完整的错误信息
            console.error('请求错误：' + err)
            // 对于客户端的错误进行提示，服务端的错误一律提示“网络错误”
            if (err.response.status == '400') {
                return Promise.reject(new Error('请求有误，当前请求无法被服务器理解！'))
            } else if (err.response.status == '401') {
                return Promise.reject(new Error('当前请求需要用户验证！'))
            } else if (err.response.status == '403') {
                return Promise.reject(new Error('该用户无权访问此接口！'))
            } else if (err.response.status == '404') {
                return Promise.reject(
                    new Error('请求所希望得到的资源未被在服务器上发现！')
                )
            } else if (err.response.status == '405') {
                return Promise.reject(
                    new Error('请求有误，该请求方法不能被用于请求相应的资源。')
                )
            } else {
                return Promise.reject(new Error('网络错误！'))
            }
        }
    )

    // 添加全局 request 拦截器
    instance.interceptors.request.use(
        // 发送成功前
        config => {
            // xsrf
            const xsrfToken = Cookies.get('XSRF-TOKEN')
            config.headers['X-XSRF-TOKEN'] = xsrfToken
            // if (config.config && config.config.headers.polling) return config
            return config
        },
        // 发送失败
        error => {
            console.log(error)
            return Promise.reject(error)
        }
    )

    return instance
}

export default webAxiosCreate